package cn.cyh.queue_service.service;

import cn.cyh.queue_service.model.dto.PageRequest;
import cn.cyh.queue_service.model.dto.PageResult;
import cn.cyh.queue_service.model.dto.StatisticsRequest;
import cn.cyh.queue_service.model.dto.StatisticsResponse;
import cn.cyh.queue_service.model.entity.Statistics;

import java.time.LocalDate;
import java.util.List;
import java.util.Map;

/**
 * 统计服务接口
 */
public interface StatisticsService {
    
    /**
     * 获取日统计数据
     * 
     * @param date 统计日期
     * @param serviceTypeId 业务类型ID（可选）
     * @return 统计响应列表
     */
    List<StatisticsResponse> getDailyStatistics(LocalDate date, Long serviceTypeId);
    
    /**
     * 获取日期范围内的统计数据
     * 
     * @param request 统计请求
     * @return 统计响应列表
     */
    List<StatisticsResponse> getStatistics(StatisticsRequest request);
    
    /**
     * 获取按业务类型统计的数据
     * 
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 按业务类型ID分组的统计响应
     */
    Map<Long, StatisticsResponse> getStatisticsByBusinessType(LocalDate startDate, LocalDate endDate);
    
    /**
     * 获取按窗口统计的数据
     * 
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 按窗口ID分组的统计响应
     */
    Map<Long, StatisticsResponse> getStatisticsByWindow(LocalDate startDate, LocalDate endDate);
    
    /**
     * 生成或更新指定日期的统计数据
     * 此方法通常由定时任务调用，用于每日统计
     * 
     * @param date 统计日期
     * @return 生成的统计记录数
     */
    int generateDailyStatistics(LocalDate date);
    
    /**
     * 导出统计数据（CSV格式）
     * 
     * @param request 统计请求
     * @return CSV格式的字符串
     */
    String exportStatisticsToCSV(StatisticsRequest request);
    
    /**
     * 导出统计数据（Excel格式）
     * 
     * @param request 统计请求
     * @return Excel文件的字节数组
     */
    byte[] exportStatisticsToExcel(StatisticsRequest request);
    
    /**
     * 获取当前实时统计数据
     * 不从统计表获取，而是实时计算当日数据
     * 
     * @return 统计响应
     */
    StatisticsResponse getCurrentStatistics();
    
    /**
     * 获取整体统计数据
     *
     * @param request 统计请求参数
     * @return 统计响应结果
     */
    StatisticsResponse getOverallStatistics(StatisticsRequest request);
    
    /**
     * 获取业务类型统计数据
     *
     * @param request 统计请求参数
     * @return 统计响应结果
     */
    StatisticsResponse getServiceTypeStatistics(StatisticsRequest request);
    
    /**
     * 获取窗口统计数据
     *
     * @param request 统计请求参数
     * @return 统计响应结果
     */
    StatisticsResponse getWindowStatistics(StatisticsRequest request);
    
    /**
     * 获取员工统计数据
     *
     * @param request 统计请求参数
     * @return 统计响应结果
     */
    StatisticsResponse getStaffStatistics(StatisticsRequest request);
    
    /**
     * 导出统计数据
     *
     * @param request 统计请求参数
     * @return 文件路径
     */
    String exportStatistics(StatisticsRequest request);
    
    /**
     * 获取实时统计数据
     *
     * @return 实时统计结果
     */
    Map<String, Object> getRealTimeStatistics();
    
    /**
     * 获取历史统计数据
     *
     * @param pageRequest 分页请求
     * @return 历史统计分页结果
     */
    PageResult<Map<String, Object>> getHistoricalStatistics(PageRequest pageRequest);
    
    /**
     * 更新等待人数统计
     *
     * @param serviceTypeId 业务类型ID
     */
    void updateWaitingCount(Long serviceTypeId);
    
    /**
     * 更新叫号统计
     *
     * @param serviceTypeId 业务类型ID
     * @param windowId 窗口ID
     */
    void updateCallStats(Long serviceTypeId, Long windowId);
    
    /**
     * 更新服务统计
     *
     * @param serviceTypeId 业务类型ID
     * @param windowId 窗口ID
     * @param processingTime 处理时间（秒）
     * @param waitingTime 等待时间（秒）
     */
    void updateServiceStats(Long serviceTypeId, Long windowId, Integer processingTime, Integer waitingTime);
    
    /**
     * 更新每日统计
     *
     * @param statsDate 统计日期
     * @param metrics 统计指标
     */
    void updateDailyStats(String statsDate, Map<String, Object> metrics);
    
    /**
     * 更新窗口统计
     *
     * @param windowId 窗口ID
     * @param statsDate 统计日期
     * @param metrics 统计指标
     */
    void updateWindowStats(Long windowId, String statsDate, Map<String, Object> metrics);
    
    /**
     * 更新业务类型统计
     *
     * @param serviceTypeId 业务类型ID
     * @param statsDate 统计日期
     * @param metrics 统计指标
     */
    void updateServiceTypeStats(Long serviceTypeId, String statsDate, Map<String, Object> metrics);
    
    /**
     * 更新员工统计
     *
     * @param staffId 员工ID
     * @param statsDate 统计日期
     * @param metrics 统计指标
     */
    void updateStaffStats(Long staffId, String statsDate, Map<String, Object> metrics);
}